package chapter_1.udp_test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Arrays;

/**
 * 创建一个socket服务器
 * @author fulv
 */
public class UDPServer {
    public static final int BUF_SIZE = 1024;
    public static void main(String[] args) throws SocketException {
        //创建一个服务器socket,并指定一个本地端口号
        DatagramSocket socket = new DatagramSocket(8080);
        //创建一个packet实例用于接收从客户端发送来的数据
        byte[] recvBuffer = new byte[BUF_SIZE];
        DatagramPacket packet = new DatagramPacket(recvBuffer, BUF_SIZE);
        while(true){
            try {
                socket.receive(packet);
                System.out.println("接收到来自:" + packet.getSocketAddress() + "的数据");
                /**
                 * 这里要注意，socket将接收到的消息存放在packet指定的缓冲区内
                 * 但是packet.getData()会返回缓冲区所在的byte数组的引用，
                 *packet.getLength()返回的是接收到的消息的长度
                 * 所以必须从缓冲区范围内将消息复制出来
                 */
                byte[] recvData = Arrays.copyOfRange(packet.getData(), packet.getOffset(), packet.getOffset() + packet.getLength());
                String recvStr = new String(recvData);
                System.out.println(recvStr);
                byte[] sendData = (packet.getAddress().getHostAddress() + ": " + recvStr).getBytes();
                packet.setData(sendData,0,sendData.length);
                //将接收到的数据反馈给客户端
                socket.send(packet);
                //重新设置packet的接收缓冲区的大小(packet在接收到数据后，内部长度就变成了接收数据的长度，所有需要重置)
                packet.setData(recvBuffer);
            }catch(IOException e){
                e.printStackTrace();
            }
        }

    }
}
